package com.springboot.file.service;

import com.springboot.file.param.req.ExportWordReq;
import com.springboot.file.param.resp.ExportExcelResp;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

/**
 * 通用业务服务接口
 * 提供Excel导入导出相关功能
 */
public interface CommonService {
    /**
     * 通用的业务导入功能
     * 
     * @param businessType 业务类型
     * @param file 导入文件
     */
    void importExcel(String businessType, MultipartFile file);

    /**
     * 多表格导入功能 - 将Excel中不同的sheet导入到不同的表中
     * 高性能线程池优化版本 - 使用并行处理提高导入速度
     * 支持事务管理，可以在所有sheet内容保存时使用同一个事务
     *
     * @param businessTypes 业务类型字符串，支持以下格式:
     *                     1. 带引号的逗号分隔格式: "CUST_CREDIT","INVOICE"
     *                     2. 不带引号的逗号分隔格式: CUST_CREDIT,INVOICE
     *                     3. JSON数组格式: ["CUST_CREDIT","INVOICE"]
     *                     4. JSON对象格式: {"CUST_CREDIT","INVOICE"}
     * @param file 导入文件
     * @param enableTransaction 是否启用事务管理，为true时所有sheet的保存操作将在同一事务中进行
     */
    void importMultiSheetExcel(String businessTypes, MultipartFile file, Boolean enableTransaction);

    /**
     * 通用的业务导出功能
     * 根据不同的业务类型调用不同的导出提供者，使用线程池分页导出数据
     *
     * @param businessType 业务类型
     * @param exportParams 导出条件参数
     * @param headers 动态表头，key为字段名,value为表头名称，如果为null则使用实体类的@ExcelProperty注解
     * @param response HTTP响应对象
     */
    void exportExcel(String businessType, Map<String, Object> exportParams, Map<String, String> headers, HttpServletResponse response);

    /**
     * 智能导出Excel，根据数据量自动选择单文件导出或多文件分块导出
     * 当数据量小时直接导出单个文件，数据量大时分成多个文件导出
     * 
     * @param businessType 业务类型
     * @param params 导出条件参数
     * @param headers 动态表头
     * @param fileName 文件名
     * @param response HTTP响应对象，用于单文件导出场景
     * @return 导出结果，对于分块导出会返回第一个块的信息，对于单文件导出返回null
     */
    ExportExcelResp smartExportExcel(String businessType, Map<String, Object> params, Map<String, String> headers, String fileName, HttpServletResponse response);

    /**
     * 清理导出的临时文件
     * @param exportId 导出ID
     * @return 是否清理成功
     */
    boolean cleanupExportFile(String exportId);
    
    /**
     * 通用的Word文档导出功能
     * 根据模板替换占位符生成Word文档，支持页眉、页脚、水印和页码等功能
     *
     * @param request 导出Word请求参数
     * @param response HTTP响应对象
     */
    void exportWord(ExportWordReq request, HttpServletResponse response);
    
    /**
     * 通用的Word转PDF功能
     * 将Word文档转换为PDF格式
     *
     * @param wordInputStream Word文档输入流
     * @param pdfOutputStream PDF输出流
     * @return 转换是否成功
     */
    boolean convertWordToPdf(InputStream wordInputStream, OutputStream pdfOutputStream);
    
    /**
     * 通用的Word转PDF导出功能
     * 根据模板文件和数据生成Word文档并转换为PDF后导出
     *
     * @param request 导出Word请求参数
     * @param response HTTP响应对象
     */
    void exportWordAsPdf(ExportWordReq request, HttpServletResponse response);
    
    /**
     * 获取Word模板文件
     * 
     * @param templateName 模板名称
     * @return 模板文件
     */
    File getWordTemplate(String templateName);
}
